package net.oschina.git.fsppp.manager;

import net.oschina.git.fsppp.model.P3Dir;
import net.oschina.git.fsppp.model.SimpleResponse;

import java.io.IOException;
import java.util.List;
import java.util.Set;

/**
 * 文件管理接口
 */
public interface IFileManager {
    /**
     * 初始化磁盘
     * 从resources中读取disk文件，根据 , 分割出磁盘数
     * 由于是模拟磁盘，一个磁盘用一个文件模拟
     * @return
     */
    SimpleResponse<Set> initDisk();

    /**
     * 磁盘对象转化为P3Dir
     * @return
     * @throws IOException
     */
    SimpleResponse<List<P3Dir>> listDisk();

    /**
     * 删除磁盘，将导致无法撤销后果，比如说 文件全部没了
     * @return
     * @throws IOException
     */
    SimpleResponse<Set> cleanDisks();

    /**
     * 根据路径创建文件
     * 栗子：在c:\Test目录下建立一个a.txt文件
     * @param path  c:\Test
     * @param name  a.txt
     * @return  P3Dir
     *              - type: 0
     *              - path: c:\Test
     *              - name: a.txt
     *              - attr: txt
     *              - content: Byte[]
     *              ...
     */
    SimpleResponse<P3Dir> createFile(String path, String name);

    /**
     * 修改文件，支持文件名name，文件属性attr，文件内容的修改
     * 栗子：
     * 磁盘中的dir：
     *          - name：a.txt
     *          - attr: txt
     *          - content: hello world!
     * 参数中的dir
     *          - name：b.txt
     *          - attr: txt
     *          - content: hello java!
     * 注意，未修改的保持不变,content不跟其他两个属性同时修改
     * @return
     */
    SimpleResponse<P3Dir> editFile(P3Dir dir);

    /**
     * 删除
     * @return
     */
    SimpleResponse<P3Dir> deleteFile(P3Dir dir);

    /**
     * 显示文件
     * 前提：文件已打开
     * @param dir
     * @return
     */
    SimpleResponse<String> showFileContent(P3Dir dir);

    /**
     * 打开文件
     * @param dir
     * @return
     */
    SimpleResponse<P3Dir> openFile(P3Dir dir);

    /**
     * 读文件
     * 前提：文件已打开
     * @param dir
     * @return
     */
    SimpleResponse<P3Dir> readFile(P3Dir dir);

    /**
     * 写文件
     * 前提：文件已打开
     * @param dir
     * @param content
     * @return
     */
    SimpleResponse<P3Dir> writeFile(P3Dir dir, StringBuffer content);

    /**
     * 写文件
     * 前提：文件已打开
     * @param dir
     * @return
     */
    SimpleResponse<P3Dir> closeFile(P3Dir dir);

    /**
     * 改变文件属性
     * 前提：文件已打开
     * @param dir
     * @param attr
     * @return
     */
    SimpleResponse<P3Dir> changeAttr(P3Dir dir, String attr);
}
